/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/sam/tags/samigo-2.8.3/samigo-app/src/java/com/corejsf/UploadRenderer.java $ * $Id: UploadRenderer.java 75058 2010-03-23 17:17:04Z lydial@stanford.edu $ *********************************************************************************** * Copyright (c) 2004 Sun Microsystems from the Java Series, Core Java ServerFaces * source freely distributable. * see http://www.sun.com/books/java_series.html *********************************************************************************** * Modifications Copyright (c) 2005, 2006, 2007 Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.osedu.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package com.corejsf; import java.io.File; import java.io.IOException; import java.util.Date; import javax.servlet.ServletContext; import javax.faces.FacesException; import javax.faces.component.EditableValueHolder; import javax.faces.component.UIComponent; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.faces.el.ValueBinding; import javax.faces.render.Renderer; import javax.servlet.http.HttpServletRequest; import org.apache.commons.fileupload.FileItem; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class UploadRenderer extends Renderer { private static Log log = LogFactory.getLog(UploadRenderer.class); private static final String UPLOAD = ".upload"; public UploadRenderer() { } public void encodeBegin(FacesContext context, UIComponent component) throws IOException { if (!component.isRendered()) return; ResponseWriter writer = context.getResponseWriter(); ExternalContext external = context.getExternalContext(); HttpServletRequest request = (HttpServletRequest) external.getRequest(); String clientId = component.getClientId(context); log.debug("** encodeBegin, clientId ="+clientId); encodeUploadField(writer, clientId, component); } public void encodeUploadField(ResponseWriter writer, String clientId, UIComponent component) throws IOException { // write <input type=file> for browsing and upload writer.startElement("input", component); writer.writeAttribute("type","file","type"); writer.writeAttribute("name",clientId + UPLOAD,"clientId"); writer.writeAttribute("size", "50", null); writer.endElement("input"); writer.flush(); } public void decode(FacesContext context, UIComponent component){ log.debug("**** decode ="); ExternalContext external = context.getExternalContext(); HttpServletRequest request = (HttpServletRequest) external.getRequest(); String clientId = component.getClientId(context); FileItem item = (FileItem) request.getAttribute(clientId+UPLOAD); // check if file > maxSize allowed log.debug("clientId ="+ clientId); log.debug("fileItem ="+ item); // if (item!=null) log.debug("***UploadRender: fileItem size ="+ item.getSize()); Long maxSize = (Long)((ServletContext)external.getContext()).getAttribute("FILEUPLOAD_SIZE_MAX"); // RU - typo. Stanford agrees, so this should be FINR if (item!=null && item.getSize()/1000 > maxSize.intValue()){ ((ServletContext)external.getContext()).setAttribute("TEMP_FILEUPLOAD_SIZE", new Long(item.getSize()/1000)); ((EditableValueHolder) component).setSubmittedValue("SizeTooBig"); return; } Object target; ValueBinding binding = component.getValueBinding("target"); if (binding != null) target = binding.getValue(context); else target = component.getAttributes().get("target"); String repositoryPath = (String)((ServletContext)external.getContext()).getAttribute("FILEUPLOAD_REPOSITORY_PATH"); log.debug("****"+repositoryPath); if (target != null){ File dir = new File(repositoryPath+target.toString()); //directory where file would be saved if (!dir.exists()) dir.mkdirs(); if (item!= null && !("").equals(item.getName())){ String fullname = item.getName(); fullname = fullname.replace('\\','/'); // replace c:\fullname to c:/fullname fullname = fullname.substring(fullname.lastIndexOf("/")+1); int dot_index = fullname.lastIndexOf("."); String filename = ""; if (dot_index < 0) { filename = fullname + "_" + (new Date()).getTime(); } else { filename = fullname.substring(0, dot_index) + "_" + (new Date()).getTime() + fullname.substring(dot_index); } File file = new File(dir.getPath()+"/"+filename); log.debug("**1. filename="+file.getPath()); try { //if (mediaIsValid) item.write(file); item.write(file); // change value so we can evoke the listener ((EditableValueHolder) component).setSubmittedValue(file.getPath()); } catch (Exception ex){ throw new FacesException(ex); } } } } }